package com.atguigu.c_designed.m3beheviorModel.b8Memento;

/**
 * 备忘录模式本质是从发起人实体类(Originator) 隔离存储功能，降低实体类的职责。
 * 同时 由于存储信息( Memento ) 独 立 ，且存储信息的实体交由管理类(Caretaker) 管 理 ，
 * 则可以 通过为管理类扩展额外的功能对存储信息进行扩展操作(比如增加历史快照功能…) 。
 */

/**
 * 优点：
 *
 * 1、简化发起人实体类(Originator ) 职责 ,隔离状态存储与获取，实现了信息的封装，客户端无需关心状态的保存细节;
 * 2、提供状态回滚功能；
 * 缺点：
 * 1、消耗资源：如果需要保存的状态过多时,每一次保存都会消耗很多内存。
 */
public class MementoTest {
    public static void main(String[] args) {
        CareTakerDraftsBox careTakerDraftsBox = new CareTakerDraftsBox();
        OriginatorEditor originatorEditor = new OriginatorEditor("我是这样手写Spring的，麻雀虽小五脏俱全",
                "本文节选自《Spring5核心原理与30个类手写实战》一书，Tom著，电子工业出版社出版。",
                "35576a9ef6fc407aa088eb8280fb1d9d.png");
        MementoArticle mementoArticle = originatorEditor.saveToMemento();
        careTakerDraftsBox.addMemento(mementoArticle);
        System.out.println("标题：" + originatorEditor.getTitle() + "\n" +
                "内容：" + originatorEditor.getContent() + "\n" +
                "插图：" + originatorEditor.getImg() + "\n暂存成功");
        System.out.println("完整的信息" + originatorEditor);

        System.out.println("==========首次修改文章===========");
        originatorEditor.setTitle("【Tom原创】我是这样手写Spring的，麻雀虽小五脏俱全");
        originatorEditor.setContent("本文节选自《Spring5核心原理与30个类手写实战》一书，Tom著");

        System.out.println("==========首次修改文章完成===========");

        System.out.println("完整的信息" + originatorEditor);

        System.out.println("==========保存到草稿箱===========");
        mementoArticle = originatorEditor.saveToMemento();
        careTakerDraftsBox.addMemento(mementoArticle);

        System.out.println("==========第2次修改文章===========");
        originatorEditor.setTitle("手写Spring");
        originatorEditor.setContent("本文节选自《Spring5核心原理与30个类手写实战》一书，Tom著");
        System.out.println("完整的信息" + originatorEditor);
        System.out.println("==========第2次修改文章完成===========");
        System.out.println("==========第1次撤销===========");
        mementoArticle = careTakerDraftsBox.getMemento();
        originatorEditor.undoFromMemento(mementoArticle);
        System.out.println("完整的信息" + originatorEditor);
        System.out.println("==========第1次撤销完成===========");


        System.out.println("==========第2次撤销===========");
        mementoArticle = careTakerDraftsBox.getMemento();
        originatorEditor.undoFromMemento(mementoArticle);
        System.out.println("完整的信息" + originatorEditor);
        System.out.println("==========第2次撤销完成===========");
    }
}
